from django import forms
from .models import ScheduledTask
from django.utils.translation import gettext_lazy as _

class ScheduledTaskForm(forms.ModelForm):
    """定时任务表单"""
    class Meta:
        model = ScheduledTask
        fields = ['name', 'description', 'cron_expression', 'is_active']
        widgets = {
            'name': forms.TextInput(attrs={'class': 'form-control', 'placeholder': _('请输入任务名称')}),
            'description': forms.Textarea(attrs={'class': 'form-control', 'rows': 3, 'placeholder': _('请输入任务描述')}),
            'cron_expression': forms.TextInput(attrs={'class': 'form-control', 'placeholder': _('例如：0 * * * * 表示每小时执行一次')}),
            'is_active': forms.CheckboxInput(attrs={'class': 'form-check-input'}),
        }
        labels = {
            'name': _('任务名称'),
            'description': _('任务描述'),
            'cron_expression': _('定时规则'),
            'is_active': _('是否激活'),
        }
        help_texts = {
            'cron_expression': _('请输入有效的cron表达式，格式为：分 时 日 月 周'),
        }
    
    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user', None)
        super().__init__(*args, **kwargs)
        self.user = user
    
    def clean_name(self):
        """验证任务名称是否已存在"""
        name = self.cleaned_data.get('name')
        if self.instance.pk:
            # 如果是编辑任务，排除当前任务
            if ScheduledTask.objects.filter(name=name, created_by=self.user).exclude(pk=self.instance.pk).exists():
                raise forms.ValidationError(_('您已创建同名的任务，请使用其他名称'))
        else:
            # 如果是创建新任务
            if ScheduledTask.objects.filter(name=name, created_by=self.user).exists():
                raise forms.ValidationError(_('您已创建同名的任务，请使用其他名称'))
        return name

class TaskExecutionLogFilterForm(forms.Form):
    """任务执行日志过滤表单"""
    task = forms.ModelChoiceField(
        queryset=ScheduledTask.objects.all(),
        required=False,
        label=_('任务'),
        widget=forms.Select(attrs={'class': 'form-control'})
    )
    start_date = forms.DateField(
        required=False,
        label=_('开始日期'),
        widget=forms.DateInput(attrs={'class': 'form-control', 'type': 'date'})
    )
    end_date = forms.DateField(
        required=False,
        label=_('结束日期'),
        widget=forms.DateInput(attrs={'class': 'form-control', 'type': 'date'})
    )
    is_success = forms.ChoiceField(
        required=False,
        label=_('执行状态'),
        widget=forms.Select(attrs={'class': 'form-control'}),
        choices=((None, _('全部')), (True, _('成功')), (False, _('失败')))
    )
    
    def clean_is_success(self):
        """将空字符串转换为None，以正确处理布尔值过滤"""
        value = self.cleaned_data.get('is_success')
        if value == '':
            return None
        # 将字符串'True'和'False'转换为对应的布尔值
        if value == 'True':
            return True
        if value == 'False':
            return False
        return value